﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ApplicationGenerator.CommonWeb;
using ApplicationGenerator.CommonModule;
using ApplicationGenerator.BusinessModule.Elements;
using System.Threading;
using ApplicationGenerator.Versions.BusinessLogic;
using WorkflowLibrary.DataAccess;
using System.Web.Configuration;
using ApplicationGenerator.BusinessModule.Interfaces;

public partial class GeneratorPages_Workflow : BasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(Request.QueryString[QuerryStringConstants.WorkflowGuid]))
        {
            AddErrorMessage("Nie można pobrać id procesu");
            return;
        }

        if (string.IsNullOrEmpty(Request.QueryString[QuerryStringConstants.WorkflowType]))
        {
            AddErrorMessage("Nie można pobrać typu procesu");
            return;
        }

        //zaaajebisty refaktoring tu jest potrzebny ;)
        if (Request.QueryString[QuerryStringConstants.WorkflowType] == QuerryStringConstants.WorkflowTypeNew)
        {
            //trzeba pobrać nazwę modelu, na podstawie której został oparty workflow
            VersionInfo modelInfo = WLDataAccessProxy.GetInstance(
                WebConfigurationManager.ConnectionStrings["ApplicationGeneratorDatabase"].ConnectionString)
                .GetModelInfo(new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]));

            IModel element = (new FacadeFactory()).CreateModelFacade().CreateModel(modelInfo.Name);
            (new FacadeFactory()).CreateModelFacade().SaveModel(element);

            int elementId = (int)element.GetProperty((new FacadeFactory()).CreateMetaModelFacade().MetaModelCollection[modelInfo.Name].PrimaryKeyName);

            WebWorkflowManager.GetInstance().CreateWorkflow(
                new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId);

            while (true)
            {
                if (WCFS.PROCESS_STATE.PROCESS_READY == WebWorkflowManager.GetInstance().IsNewPageToDisplay(
                    new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId))
                {
                    VersionInfo version = WebWorkflowManager.GetInstance().GetPageToDisplay(
                        new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId);

                    //narazie zakładamy że to są formularze, trzeba rozróżniać jakoś od list
                    Response.Redirect(QuerryStringConstants.GenerateLoadElementFormUrl(
                        Request.QueryString[QuerryStringConstants.WorkflowGuid], version.Version.ToString(), elementId));

                }

                //narazie tak, dorobimy potem automatyczne postbacki z javascripta
                Thread.Sleep(1000);
            }
        }
        else if (Request.QueryString[QuerryStringConstants.WorkflowType] == QuerryStringConstants.WorkflowTypeContinue)
        {
            if (string.IsNullOrEmpty(Request.QueryString[QuerryStringConstants.ElementId]))
            {
                AddErrorMessage("Nie można pobrać id instancji procesu");
                return;
            }

            int elementId;
            if(!int.TryParse(Request.QueryString[QuerryStringConstants.ElementId],out elementId))
            {
                AddErrorMessage("Id instancji procesu ma nieprawidłowy format");
                return;
            }
            
            WebWorkflowManager.GetInstance().GoAhead(
                new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId);

            while (true)
            {
                if (WCFS.PROCESS_STATE.PROCESS_READY == WebWorkflowManager.GetInstance().IsNewPageToDisplay(
                    new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId))
                {
                    VersionInfo version = WebWorkflowManager.GetInstance().GetPageToDisplay(
                        new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId);

                    //narazie zakładamy że to są formularze, trzeba rozróżniać jakoś od list
                    Response.Redirect(QuerryStringConstants.GenerateLoadElementFormUrl(
                        Request.QueryString[QuerryStringConstants.WorkflowGuid], version.Version.ToString(), elementId));

                }

                //narazie tak, dorobimy potem automatyczne postbacki z javascripta
                Thread.Sleep(1000);
            }
        }
        else if (Request.QueryString[QuerryStringConstants.WorkflowType] == QuerryStringConstants.WorkflowTypeLoad)
        {
            if (string.IsNullOrEmpty(Request.QueryString[QuerryStringConstants.ElementId]))
            {
                AddErrorMessage("Nie można pobrać id instancji procesu");
                return;
            }

            int elementId;
            if (!int.TryParse(Request.QueryString[QuerryStringConstants.ElementId], out elementId))
            {
                AddErrorMessage("Id instancji procesu ma nieprawidłowy format");
                return;
            }

            while (true)
            {
                /*if (WCFS.PROCESS_STATE.PROCESS_READY == WebWorkflowManager.GetInstance().IsNewPageToDisplay(
                    new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId))
                {*/
                    VersionInfo version = WebWorkflowManager.GetInstance().GetPageToDisplay(
                        new Guid(Request.QueryString[QuerryStringConstants.WorkflowGuid]), elementId);

                    //narazie zakładamy że to są formularze, trzeba rozróżniać jakoś od list
                    Response.Redirect(QuerryStringConstants.GenerateLoadElementFormUrl(
                        Request.QueryString[QuerryStringConstants.WorkflowGuid], version.Version.ToString(), elementId));

                //}

                //narazie tak, dorobimy potem automatyczne postbacki z javascripta
                Thread.Sleep(1000);
            }
        }
    }
}
